package com.base.project.main

import androidx.lifecycle.viewModelScope
import coil.imageLoader
import coil.request.CachePolicy
import coil.request.ImageRequest
import com.base.project.App
import com.hjq.toast.Toaster
import com.orange.common.base.BaseViewModel
import com.orange.common.ktx.dp
import com.orange.common.ktx.pxToDp
import com.orange.common.net.Url
import com.orange.common.net.ktx.callGet
import com.orange.common.net.ktx.msg
import kotlinx.coroutines.async
import kotlinx.coroutines.launch

class MainViewModel : BaseViewModel() {

    fun loadGameInfo() {
        viewModelScope.launch {
            // 一行代码完成网络请求，请求失败result == null
            callGet<Any>(Url.GAME_CURRENT)?.let { result ->
                //具体逻辑
            }

            callGet<Any>(Url.GAME_CURRENT){
                //可以在这里处理异常,默认是toast显示错误信息
                Toaster.show(it.msg)
                showError()
            }?.let {any ->
                //具体逻辑
            }

            val result2 = callGet<Any>(Url.GAME_CURRENT){ throwable ->
                //可以在这里处理异常,默认是toast显示错误信息
            }

            launch {  }

            //并行任务                                      //↓ main
            val userInfoAsync = async { loadUserInfo() }  //↓ io线程
            val settingAsync = async { loadSetting() }    //↓ io线程 ↓ io线程
            //当执行到async代码块的时候就已经开始执行了          //↓ main
            //等待两个任务的执行结果
            val user = userInfoAsync.await()
            val setting = settingAsync.await()
        }
        //串行任务
        viewModelScope.launch {
            //先执行登录                      //<-- main线程
            val loginResult = deviceLogin() //<-- io线程
            //....这里可以一些其他处理          //<-- 回到main线程
            //再获取用户信息
            val userInfo = loadUserInfo()   //<-- io线程
        }

        //并行任务
        viewModelScope.launch {
            //先执行登录                      //<-- main线程
            val loginResult = deviceLogin() //<-- io线程
            //....这里可以一些其他处理          //<-- 回到main线程
            //再获取用户信息
            val userInfo = loadUserInfo()   //<-- io线程
        }

        //dp转px
        var width:Number = 10.dp
        //px转dp
        width = 10.pxToDp()

    }

    suspend fun deviceLogin(): Any? {
        return callGet(Url.GAME_CURRENT)
    }

    suspend fun loadUserInfo(): Any? {
        return callGet(Url.GAME_CURRENT)
    }

    suspend fun loadSetting(): Any? {
        return callGet(Url.GAME_CURRENT)
    }

    /**
     * 预加载图片
     */
    fun preloadImage() {
        val url = ""
        if (url.isNotEmpty()){
            val context = App.context
            val request = ImageRequest.Builder(context)
                .data(url)
                .memoryCachePolicy(CachePolicy.DISABLED)
                .build()
            context.imageLoader.enqueue(request)
        }
    }
}